32. 解决方案:CASE
解决方案:CASE
-
我们想要根据相关的购买量了解三组不同的客户。最高的一组是终身价值(所有订单的总销售额)
大于 200,000
美元的客户。第二组是在200,000 到 100,000
美元之间的客户。最低的一组是低于under 100,000
美元的客户。请提供一个表格,其中包含与每个 客户 相关的 级别 。你应该提供客户的 名称 、 所有订单的总销售额 和 级别 。消费最高的客户列在最上面。
SELECT a.name, SUM(total_amt_usd) total_spent,
CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top'
WHEN SUM(total_amt_usd) > 100000 THEN 'middle'
ELSE 'low' END AS customer_level
FROM orders o
JOIN accounts a
ON o.account_id = a.id
GROUP BY a.name
ORDER BY 2 DESC;
-
现在我们想要执行和第一个问题相似的计算过程,但是我们想要获取在
2016
年和2017
年客户的总消费数额。级别和上一个问题保持一样。消费最高的客户列在最上面。
SELECT a.name, SUM(total_amt_usd) total_spent,
CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top'
WHEN SUM(total_amt_usd) > 100000 THEN 'middle'
ELSE 'low' END AS customer_level
FROM orders o
JOIN accounts a
ON o.account_id = a.id
WHERE occurred_at > '2015-12-31'
GROUP BY 1
ORDER BY 2 DESC;
-
我们想要找出绩效最高的
销售代表
,也就是有超过 200 个订单的销售代表。创建一个包含以下列的表格:
销售代表名称
、订单总量和标为
top
或not
的列(取决于是否拥有超过 200 个订单)。销售量最高的销售代表列在最上面。
SELECT s.name, COUNT(*) num_ords,
CASE WHEN COUNT(*) > 200 THEN 'top'
ELSE 'not' END AS sales_rep_level
FROM orders o
JOIN accounts a
ON o.account_id = a.id
JOIN sales_reps s
ON s.id = a.sales_rep_id
GROUP BY s.name
ORDER BY 2 DESC;
值得注意的是,上述语句假定每个名称是唯一的,好几次都是这么假定的。否则需要根据名称和 ID 拆分表格。
-
之前的问题没有考虑中间水平的销售代表或销售额。管理层决定也要看看这些数据。我们想要找出绩效很高的
销售代表
,也就是有超过
200
个订单或总销售额超过750000
美元的销售代表。中间
级别是指有超过 150 个订单或销售额超过500000
美元的销售代表。创建一个包含以下列的表格: 销售代表名称 、总订单量、所有订单的总销售额,以及标为top
、middle
或low
的列(取决于上述条件)。在最终表格中将销售额最高的销售代表列在最上面。
SELECT s.name, COUNT(*), SUM(o.total_amt_usd) total_spent,
CASE WHEN COUNT(*) > 200 OR SUM(o.total_amt_usd) > 750000 THEN 'top'
WHEN COUNT(*) > 150 OR SUM(o.total_amt_usd) > 500000 THEN 'middle'
ELSE 'low' END AS sales_rep_level
FROM orders o
JOIN accounts a
ON o.account_id = a.id
JOIN sales_reps s
ON s.id = a.sales_rep_id
GROUP BY s.name
ORDER BY 3 DESC;
根据上述标准,你可能会见到几个表现很差的销售代表!